﻿#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>

//预定义符号也是在预处理期间处理的
//int main()
//{
//	printf("%s\n", __FILE__);//打印进⾏编译的源⽂件
//	printf("%s\n", __DATE__);//打印⽂件被编译的⽇期
//	printf("%s\n", __TIME__);//打印⽂件被编译的时间
//	printf("%d\n", __LINE__);//打印⽂件当前的⾏号
//	//printf("%d\n", __STDC__);//error,当前vs坏境不支持ANSIC
//	return 0;
//}


//#define 定义常量
//#define MAX 1000//定义常量
//#define str "hello bite"
//#define do_forever for(;;) //定义for循环
//#define CASE break;case //在写case语句的时候⾃动把 break写上。
//
//// 如果定义的 stuff过⻓，可以分成⼏⾏写，除了最后⼀⾏外，每⾏的后⾯都加⼀个反斜杠(续⾏符)。
//#define DEBUG_PRINT printf("file:%s\tline:%d\t \
//                           date:%s\ttime:%s\n" ,\
//                            __FILE__,__LINE__ , \
//                            __DATE__,__TIME__ ) 
//int main()
//{
//	int m = MAX;
//	printf("%s\n", str);
//	return 0;
//}

//#define定义宏：允许把参数替换到⽂本中，这种实现通常称为宏（macro）或定义宏（define macro）。
//#define name( parament-list ) stuff
//其中的 parament - list 是⼀个由逗号隔开的符号表，它们可能出现在stuff中。
//参数列表的左括号必须与name紧邻，如果两者之间有任何空⽩存在，参数列表就会被解释为stuff的⼀部分。举例如下
//#define sqrt(x) (x)*(x)//相当于函数
//int main()
//{
//	int a = 5;
//	int ret = sqrt(a+1);
//	printf("%d\n", ret);
//	return 0;
//}

//#define max(x,y) ((x)>(y)?(x):(y))// 带有副作⽤的宏参数
//int main()
//{
//	int a = 3;
//	int b = 5;
//	int m = max(a++, b++);
//	printf("%d\n", m);//6
//	printf("%d\n", a);//4
//	printf("%d\n", b);//7
//	return 0;
//}


//宏 函数的对⽐
//#define max(x,y) ((x)>(y)?(x):(y))//宏通常被应⽤于执⾏简单的运算。
//int Max(int x, int y)
//{
//	return x > y ? x : y;
//}
//int main()
//{
//	int m1 = Max(3, 2);
//	int m2 = max(3, 2);
//	printf("m1=%d\n", m1);
//	printf("m2=%d\n", m2);
//	return 0;
//}

//#运算符:将宏的⼀个参数转换为字符串字⾯量。它仅允许出现在带参数的宏的替换列表中。"#n"
//#define Print(n,format)  printf("the value of "#n" is "format"\n",n);
//int main()
//{
//	int a = 1;
//	Print(a, "%d");
//
//	int b = 20;
//	Print(b, "%d");
//
//	float f = 5.3f;
//	Print(f, "%f");
//	return 0;
//}

// ## 运算符:可以把位于它两边的符号合成⼀个符号，它允许宏定义从分离的⽂本⽚段创建标识符。 ## 被称为记号粘合
//int int_max(int x, int y)
//{
//	return x > y ? x : y;
//}
//float float_max(float x, float y)
//{
//	return x > y ? x : y;
//}
//改写如下所示：type##_max合成一个符号
//#define GENERIC_MAX(type) \
//type type##_max(type x, type y)\
//{ \
// return (x>y?x:y); \
//}
//GENERIC_MAX(int);
//GENERIC_MAX(float);
//int main()
//{
//	int r1 = int_max(3, 5);
//	printf("%d\n", r1);
//
//	float r2 = float_max(3.1f, 5.3f);
//	printf("%f\n", r2);
//	return 0;
//}

//条件编译
//#define M 3
//int main()
//{
//#if M==0
//	printf("hehe\n");
//#elif M==1
//	printf("haha\n");
//#elif M==2
//	printf("heihei\n");
//#else
//	printf("ok\n");
//#endif
//	return 0;
//}
//#define MAX 1
//int main()
//{
////#if defined(MAX)
////	printf("hehe\n");
////#endif
////#ifdef MAX
////	printf("hehe\n");
////#endif 
//
//
////#if !defined(MAX)
////	printf("hehe\n");
////#endif
//#ifndef MAX//如果没有定义
//	printf("hehe\n");
//#endif
//	return 0;
//}

